//using System;
//using System.Collections;
//using System.Text;

//OracleDB
//using SqlToolkit.Oracle.Base;

//namespace SqlToolkit.Oracle
//{
//    /// <summary>
//    /// Represents a table join sql string. Only the join clause not an entire statement.
//    /// </summary>
//    [Serializable]
//    public sealed class TableJoin
//    {
//        public enum Direction
//        {
//            INNER,
//            OUTER,
//            RIGHT,
//            LEFT
//        }

//        private Direction _joinDir = Direction.INNER;
//        private SqlDbTable _leftTable = null;
//        private SqlDbTable _rightTable = null;
//        private int _leftColumnIdx = 0;
//        private int _rightColumnIdx = 0;
//        private OracleSqlTools.CodeDom.FilterOperatorType _columnOperator = OracleSqlTools.CodeDom.FilterOperatorType.Equal;

//        public OracleSqlTools.CodeDom.FilterOperatorType ColumnCompareOperator
//        {
//            get { return _columnOperator; }
//            set { _columnOperator = value; }
//        }

//        /// <summary>
//        /// The direction/type of join to be used.
//        /// </summary>
//        public Direction JoinDirection
//        {
//            get { return _joinDir; }
//            set { _joinDir = value; }
//        }

//        /// <summary>
//        /// The table that will reside on the left side of join.
//        /// </summary>
//        public SqlDbTable LeftTable
//        {
//            get { return _leftTable; }
//            set { _leftTable = value; }
//        }

//        /// <summary>
//        /// The table that will reside on the right side of join.
//        /// </summary>
//        public SqlDbTable RightTable
//        {
//            get { return _rightTable; }
//            set { _rightTable = value; }
//        }

//        public int LeftColumnIndex
//        {
//            get { return _leftColumnIdx; }
//            set { _leftColumnIdx = value; }
//        }

//        public int RightColumnIndex
//        {
//            get { return _rightColumnIdx; }
//            set { _rightColumnIdx = value; }
//        }
    
//    }

//    [Serializable]
//    public sealed class SqlDbCustomObjectCollection : OracleDataObjectCollectionBase
//    {
//        #region Construction
//        public SqlDbCustomObjectCollection() { }
//        #endregion
//        #region Add
//        public int Add(SqlDbCustomObject value)
//        {
//            return base.Add(value);
//        }
//        #endregion
//        #region IndexOf
//        public int IndexOf(SqlDbCustomObject value)
//        {
//            return base.IndexOf(value);
//        }
//        #endregion
//        #region Insert
//        public void Insert(int index, SqlDbCustomObject value)
//        {
//            base.Insert(index, value);
//        }
//        #endregion
//        #region Remove
//        public void Remove(SqlDbCustomObject value)
//        {
//            base.Remove(value);
//        }
//        #endregion
//        #region Indexer
//        new public SqlDbCustomObject this[int index]
//        {
//            get { return (SqlDbCustomObject)base[index]; }
//        }
//        #endregion
//    }

//    public class SqlDbCustomObject : IOracleDataObject
//    {
//        #region Joins
//        private ArrayList _joins = null;
//        public int AddJoin(TableJoin tableJoin)
//        {
//            if(null == _joins) _joins = new ArrayList();

//            return _joins.Add(tableJoin);
//        }
//        public void RemoveJoin(int index)
//        {
//            if (null == _joins) return;
//            _joins.RemoveAt(index);
//        }
//        public void RemoveJoin(TableJoin tableJoin)
//        {
//            if (null == _joins) return;
//            _joins.Remove(tableJoin);
//        }

//        #endregion
//        #region Columns
//        SqlDbTableFieldCollection col = null;
//        public SqlDbTableFieldCollection Columns
//        {
//            get
//            {
//                if (null == col)
//                    col = new SqlDbTableFieldCollection();

//                return col;
//            }
//        }
//        public void AddColumn(SqlDbTableField col)
//        {
//            this.Columns.Add(col);
//        }
//        public void RemoveColumn(SqlDbTableField col)
//        {
//            Columns.Remove(col);
//        }
//        #endregion

//        private OracleSqlTools.CodeDom.QueryFilterList _where = null;
//        public OracleSqlTools.CodeDom.QueryFilterList WhereClause
//        {
//            get { return _where; }
//            set { _where = value; }
//        }

//        private bool _usePre9i = false;
//        /// <summary>
//        /// Not implemented.
//        /// </summary>
//        public bool UsePre9iSyntax
//        {
//            get { return _usePre9i; }
//            set { _usePre9i = value; }
//        }


//        public string GetSelect() 
//        {
//            StringBuilder sb = new StringBuilder();

//            sb.Append("SELECT ");

//            foreach(SqlDbTableField tf in this.Columns)
//            {
//                sb.Append(tf.TableName + "." + tf.ColumnName + ", ");
//            }

//            string tmp = sb.ToString();

//            tmp = tmp.Substring(0, tmp.Length - 2);
//            sb = new StringBuilder(tmp);
//            tmp = String.Empty;

//            sb.Append(" FROM");

//            int ij = 0;
//            foreach (TableJoin tj in this._joins)
//            {
//                string op = OracleSqlTools.CodeDom.QueryFilter.OperatorString(tj.ColumnCompareOperator);
//                if (ij < 1)
//                {   //join start
//                    sb.Append("(( " + tj.LeftTable.TableName + " " + tj.JoinDirection.ToString() + " JOIN " + tj.RightTable.TableName + " ON " + tj.LeftTable.Columns[tj.LeftColumnIndex].ColumnName + " " + op + " " + tj.RightTable.Columns[tj.RightColumnIndex].ColumnName + ")");
//                }
//                else if (ij == (this._joins.Count - 1))
//                {   //join end
//                    sb.Append(/*" " + tj.LeftTable.TableName + */" " + tj.JoinDirection.ToString() + " JOIN " + tj.RightTable.TableName + " ON " + tj.LeftTable.Columns[tj.LeftColumnIndex].ColumnName + " " + op + " " + tj.RightTable.Columns[tj.RightColumnIndex].ColumnName + "))");
//                }
//                else
//                {   //join middle parts
//                    sb.Append(/*" " + tj.LeftTable.TableName + */" (" + tj.JoinDirection.ToString() + " JOIN " + tj.RightTable.TableName + " ON " + tj.LeftTable.Columns[tj.LeftColumnIndex].ColumnName + " " + op + " " + tj.RightTable.Columns[tj.RightColumnIndex].ColumnName + ")" );
//                }

//                ij++;
//            }

//            if(this.WhereClause.Count > 0) sb.Append(" WHERE " + this.WhereClause.GetCheckClause());
            
//            return sb.ToString();
//        }
//    }
//}
